package com.qf.userayth01.service.impl;

import cn.hutool.core.text.PasswdStrength;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.qf.userayth01.dao.UserDao;
import com.qf.userayth01.dto.UserAddDto;
import com.qf.userayth01.dto.UserLoginDto;
import com.qf.userayth01.entity.User;
import com.qf.userayth01.service.intf.UserService;
import com.qf.userayth01.util.JedisUtil;
import com.qf.userayth01.util.PassUtil;
import com.qf.userayth01.vo.R;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.Date;

/**
 * ━━━━━━神兽出没━━━━━━
 * 　　　┏┓　　　┏┓
 * 　　┏┛┻━━━┛┻┓
 * 　　┃　　　　　　 ┃
 * 　　┃　　　━　　　┃
 * 　　┃　┳┛　┗┳　  ┃
 * 　　┃　　　　　　 ┃
 * 　　┃　　　┻　　　┃
 * 　　┃　　　　　　　┃
 * 　　┗━┓　　　┏━┛Code is far away from bug with the animal protecting
 * 　　　　┃　　　┃    神兽保佑,代码无bug
 * 　　　　┃　　　┃
 * 　　　　┃　　　┗━━━┓
 * 　　　　┃　　　　　　　┣┓
 * 　　　　┃　　　　　　　┏┛
 * 　　　　┗┓┓┏━┳┓┏┛
 * 　　　　　┃┫┫　┃┫┫
 * 　　　　　┗┻┛　┗┻┛
 * ━━━━━━永无BUG!━━━━━━
 *
 * @author csh
 * @date 2022/12/7
 */
@Service
public class UserServiceImpl implements UserService {
    @Resource
    private UserDao dao;
    private final String PASS_kEY="PvDCLxg7IkwBr/idSiOWcA==";
    /**
     * 手机号校验
     * @param phone
     * @return
     */
    @Override
//    public R checkPhone(String phone) {
//        //入参校验
//        if(StringUtils.hasLength(phone)){
//            //手机号 正则校验 符合手机号格式
//            if(phone.matches("^1[3456789]\\d{9}$")){
//                //查询数据库并完成校验
//                if(dao.selectObjs(new QueryWrapper<User>().eq("phone",phone))==null){
//                    return R.ok();
//                }
//            }
//        }
//        return R.fail("亲手机号不合规");
//    }
    public R checkPhone(String phone) {
        //1.参数校验
        if(StringUtils.hasLength(phone)){
            //2.手机号 正则校验 符合手机号格式
            if(phone.matches("^1[3456789]\\d{9}$")){
                //3.查询数据库并完成校验
                if(dao.selectOne(new QueryWrapper<User>().eq("phone",phone))==null){
                    return R.ok();
                }
            }
        }
        return R.fail("亲，输入的手机号不合规！");
    }

    /**
     * 昵称校验
     * @param name
     * @return
     */
    @Override
    public R checkName(String name) {
        //参数校验
        if(StringUtils.hasLength(name)){
            //查询数据库并完成校验
            if(dao.selectOne(new QueryWrapper<User>().eq("name",name))==null){
                return R.ok();
            }
        }
        return R.fail("亲，输入的昵称不对");
    }
    /**
     * 注册
     */
    @Override
    public R register(UserAddDto dto) {
        //校验
        if(dto!=null){
            if(StringUtils.hasLength(dto.getPhone())&& StringUtils.hasLength(dto.getName())){
                //校验手机号或着是用户名 是否存在
                QueryWrapper<User>queryWrapper=new QueryWrapper<>();
                queryWrapper.eq("phone",dto.getPhone()).or().eq("name",dto.getName());
                if(dao.selectOne(queryWrapper)==null){
                    User user=new User();
                    //可用 注册 密码转为密文 AES算法（对称加解密算法）
                    user.setPassword(PassUtil.aesEnc(PASS_kEY,dto.getPasswherd()));
                    user.setName(dto.getName());
                    user.setPhone(dto.getPhone());
                    user.setFlag(1);
                    user.setCtime(new Date());
                    //操作数据库
                    if(dao.insert(user)>0){
                        //注册成功
                        return R.ok();
                    }
                }

                }
            }

        return R.fail("注册异常");
    }
    /**
     * 登录 账号（手机号） 密码
     */
    @Override
    public R loginAccount(UserLoginDto dto) {
        //校验
        if(dto!=null){
            if(StringUtils.hasLength(dto.getAccount())&& StringUtils.hasLength(dto.getPassword())){
                //查询
                QueryWrapper<User> queryWrapper=new QueryWrapper<>();
                queryWrapper.eq("phone",dto.getAccount()).or().eq("name",dto.getPassword());
                User user=dao.selectOne(queryWrapper);
                //校验账号 是否存在
                if(user!=null){
                    //手机号或用户名存在
                    //校验密码，密文进行比较
                    if(user.getPassword().equals(PassUtil.aesEnc(PASS_kEY,dto.getPassword()))){
                        //登录成功 令牌：登录成功的标识，可以很简单，也可以很复杂 令牌存储起来，有效期
                        String token=user.getId()+"";
                        JedisUtil.addStr("auto:token:"+user.getPhone(),token,1800);
                        //返回 记得把令牌返回
                        return R.ok(token);

                    }
                }
            }

        }
        return R.fail("亲正好或者密码不正确");
    }
    /**
     * 登录 手机验证码登录
     */
    @Override
    public R loginCode(UserLoginDto dto) {
        //验证
        if(dto!=null){
            if (StringUtils.hasLength(dto.getAccount())){
                //实现数据库的查询
                User user=dao.selectOne(new QueryWrapper<User>().eq("phone",dto.getAccount()));
                if(user!=null){
                    //手机号存在 再校验是否有验证码
                    if(JedisUtil.existsKey("auth:login:"+dto.getAccount())){
                        //比较验证码
                        if(JedisUtil.getStr("auth:login:"+dto.getAccount()).equals(dto.getPassword())){
                            //5.成功  生成令牌 存储到Redis
                            String token=user.getId()+"";
                            JedisUtil.addStr("auth:token:"+user.getPhone(),token,1800);
                            //6.删除验证码 保证一次性
                            JedisUtil.delKeys("auth:login:"+user.getPhone());
                            //7.返回 记得把令牌返回
                            return R.ok(token);
                        }
                    }
                }
            }
        }
        return R.fail("亲，账号或验证码不正确！");
    }
    /**
     * 令牌
     */
    @Override
    public R checkToken(String phone, String token) {
        //校验
        if(StringUtils.hasLength(phone)){
            //验证是否存在
            if(JedisUtil.existsKey("auth:token"+phone)){
                //3.在比对 令牌的内容
                if(token.equals(JedisUtil.getStr("auth:token:"+phone))){

                    return R.ok();
                }
            }
        }
        return null;
    }

    @Override
    public R all() {
        return R.ok(dao.selectList(null));
    }
}
